#include "workcheck.h"
#include "ui_workcheck.h"

using namespace cv;
using namespace std;

extern CascadeClassifier cascade;  //声明同一个分类器对象cascade

workCheck::workCheck(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::workCheck)
{
    ui->setupUi(this);
    connect(ui->back,&QPushButton::clicked,[=](){
        emit this->back();
    });  //按返回键回到上个界面

    QTimer *pTimer = new QTimer();
    connect(pTimer, SIGNAL(timeout()), this, SLOT(showTime()));
    pTimer->start(100);  //用一个定时信号来更改时间

    connect(this,SIGNAL(compare()),this,SLOT(compare_face()));

}

void workCheck::showTime(){
    //获取并在LCD上输出日期和时间
    QDateTime current = QDateTime::currentDateTime();
    ui->timeShow->display(current.toString("yyyy-MM-dd  HH:mm:ss"));
}


workCheck::~workCheck()
{
    delete ui;
}

void workCheck::on_begin_clicked()
{
    //调用摄像头
    VideoCapture video;
    video.open(0);

    stop = false;

    //检测摄像头是否成功打开
    if (!video.isOpened()) {
    cout << "摄像头加载出错！" << endl;
    exit(-1);
    }

    /*载入已训练的人脸识别算法，具体路径需要根据opencv库安装位置在config.h更改*/
    const string casPath = HAAR_PATH;

    //检测是否成功加载级联分类器
    if (!cascade.load(casPath)) {
        cout << "算法加载失败！" << endl;
        exit(-1);
    }

    ui->detect->setScaledContents(true);

    while (stop != true) {
        Mat vClip;
        video >> vClip;  //视频转为图像

        //若突然没有视频信号则结束
        if (vClip.empty()) {
            break;
        }

        //灰度化，减少计算
        Mat imgGray;
        cvtColor(vClip, imgGray, COLOR_BGR2GRAY);

        vector<Rect> faces(0);
        cascade.detectMultiScale(imgGray, faces, 1.1, 2, 0, Size(30, 30));  //调用人脸识别算法

        if (faces.size() > 0) {
            for (size_t i = 0; i < faces.size(); i++) {
                rectangle(vClip, faces[i], Scalar(0, 0, 255), 2, 8, 0);  //生成矩形框出人脸
            }
        }

        //无人脸
        if (faces.size() == 0) {
            ui->info->setText("未识别到人脸！");
        }

        //不止一张人脸（不能确定谁打卡）
        else if (faces.size() > 1) {
            ui->info->setText("请逐个打卡！");
        }

        //一张人脸
        else {
            ui->info->setText("请保持不动！");

            if (0/*需要改条件*/) {
                emit compare();
            }            //检测到同一个人脸一段时间之后（需要提取特征但是无需比对），发送信号进行比对
        }


        Mat temp;
        cvtColor(vClip,temp,COLOR_BGR2RGB);//BGR转化为RGB
        QImage Qtemp = QImage((const unsigned char*)(temp.data),
                                temp.cols, temp.rows, temp.step,
                                QImage::Format_RGB888);

        ui->detect->setPixmap(QPixmap::fromImage(Qtemp));  //输出检测后带框的人脸

        waitKey(1); //waitkey 1ms的延迟
        QApplication::processEvents();
    }

}

void workCheck::compare_face(){
    //输入固定人脸参数
    //比对
    //if没有，lineedit输出无
    //if有，lineedit输出数据，qmessagebox问（显示是否打卡）
        //if最近一段时间打卡过（比对数据），qmessagebox提示失败
        //else提示成功
}

//停止按钮，停止检测，清屏
void workCheck::on_stop_clicked()
{
    stop = true;
    ui->info->clear();
    ui->detect->clear();
}

//返回按钮，停止检测，清屏并返回上一界面
void workCheck::on_back_clicked()
{
    stop = true;
    ui->info->clear();
    ui->detect->clear();
}
